/**
 *
 *    geo-platform
 *    Rich webgis framework
 *    http://geo-platform.org
 *   ====================================================================
 *
 *   Copyright (C) 2008-2021 geoSDI Group (CNR IMAA - Potenza - ITALY).
 *
 *   This program is free software: you can redistribute it and/or modify it
 *   under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version. This program is distributed in the
 *   hope that it will be useful, but WITHOUT ANY WARRANTY; without
 *   even the implied warranty of MERCHANTABILITY or FITNESS FOR
 *   A PARTICULAR PURPOSE. See the GNU General Public License
 *   for more details. You should have received a copy of the GNU General
 *   Public License along with this program. If not, see http://www.gnu.org/licenses/
 *
 *   ====================================================================
 *
 *   Linking this library statically or dynamically with other modules is
 *   making a combined work based on this library. Thus, the terms and
 *   conditions of the GNU General Public License cover the whole combination.
 *
 *   As a special exception, the copyright holders of this library give you permission
 *   to link this library with independent modules to produce an executable, regardless
 *   of the license terms of these independent modules, and to copy and distribute
 *   the resulting executable under terms of your choice, provided that you also meet,
 *   for each linked independent module, the terms and conditions of the license of
 *   that module. An independent module is a module which is not derived from or
 *   based on this library. If you modify this library, you may extend this exception
 *   to your version of the library, but you are not obligated to do so. If you do not
 *   wish to do so, delete this exception statement from your version.
 */
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.5-b10 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2015.06.17 at 04:41:23 PM CEST 
//


package org.geosdi.geoplatform.xml.iso19139.v20060504.gmd;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import org.geosdi.geoplatform.xml.iso19139.v20060504.gco.AbstractObjectType;
import org.geosdi.geoplatform.xml.iso19139.v20060504.gco.CharacterStringPropertyType;
import org.geosdi.geoplatform.xml.iso19139.v20060504.gco.DatePropertyType;
import org.geosdi.geoplatform.xml.iso19139.v20060504.gco.ObjectReferencePropertyType;
import org.jvnet.jaxb2_commons.lang.JAXBToStringStrategy;
import org.jvnet.jaxb2_commons.lang.ToString;
import org.jvnet.jaxb2_commons.lang.ToStringStrategy;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;


/**
 * Information about the metadata
 * 
 * <p>Java class for MD_Metadata_Type complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="MD_Metadata_Type">
 *   &lt;complexContent>
 *     &lt;extension base="{http://www.isotc211.org/2005/gco}AbstractObject_Type">
 *       &lt;sequence>
 *         &lt;element name="fileIdentifier" type="{http://www.isotc211.org/2005/gco}CharacterString_PropertyType" minOccurs="0"/>
 *         &lt;element name="language" type="{http://www.isotc211.org/2005/gco}CharacterString_PropertyType" minOccurs="0"/>
 *         &lt;element name="characterSet" type="{http://www.isotc211.org/2005/gmd}MD_CharacterSetCode_PropertyType" minOccurs="0"/>
 *         &lt;element name="parentIdentifier" type="{http://www.isotc211.org/2005/gco}CharacterString_PropertyType" minOccurs="0"/>
 *         &lt;element name="hierarchyLevel" type="{http://www.isotc211.org/2005/gmd}MD_ScopeCode_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="hierarchyLevelName" type="{http://www.isotc211.org/2005/gco}CharacterString_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="contact" type="{http://www.isotc211.org/2005/gmd}CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
 *         &lt;element name="dateStamp" type="{http://www.isotc211.org/2005/gco}Date_PropertyType"/>
 *         &lt;element name="metadataStandardName" type="{http://www.isotc211.org/2005/gco}CharacterString_PropertyType" minOccurs="0"/>
 *         &lt;element name="metadataStandardVersion" type="{http://www.isotc211.org/2005/gco}CharacterString_PropertyType" minOccurs="0"/>
 *         &lt;element name="dataSetURI" type="{http://www.isotc211.org/2005/gco}CharacterString_PropertyType" minOccurs="0"/>
 *         &lt;element name="locale" type="{http://www.isotc211.org/2005/gmd}PT_Locale_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="spatialRepresentationInfo" type="{http://www.isotc211.org/2005/gmd}MD_SpatialRepresentation_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="referenceSystemInfo" type="{http://www.isotc211.org/2005/gmd}MD_ReferenceSystem_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="metadataExtensionInfo" type="{http://www.isotc211.org/2005/gmd}MD_MetadataExtensionInformation_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="identificationInfo" type="{http://www.isotc211.org/2005/gmd}MD_Identification_PropertyType" maxOccurs="unbounded"/>
 *         &lt;element name="contentInfo" type="{http://www.isotc211.org/2005/gmd}MD_ContentInformation_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="distributionInfo" type="{http://www.isotc211.org/2005/gmd}MD_Distribution_PropertyType" minOccurs="0"/>
 *         &lt;element name="dataQualityInfo" type="{http://www.isotc211.org/2005/gmd}DQ_DataQuality_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="portrayalCatalogueInfo" type="{http://www.isotc211.org/2005/gmd}MD_PortrayalCatalogueReference_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="metadataConstraints" type="{http://www.isotc211.org/2005/gmd}MD_Constraints_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="applicationSchemaInfo" type="{http://www.isotc211.org/2005/gmd}MD_ApplicationSchemaInformation_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="metadataMaintenance" type="{http://www.isotc211.org/2005/gmd}MD_MaintenanceInformation_PropertyType" minOccurs="0"/>
 *         &lt;element name="series" type="{http://www.isotc211.org/2005/gmd}DS_Aggregate_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="describes" type="{http://www.isotc211.org/2005/gmd}DS_DataSet_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="propertyType" type="{http://www.isotc211.org/2005/gco}ObjectReference_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="featureType" type="{http://www.isotc211.org/2005/gco}ObjectReference_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="featureAttribute" type="{http://www.isotc211.org/2005/gco}ObjectReference_PropertyType" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MD_Metadata_Type", propOrder = {
    "fileIdentifier",
    "language",
    "characterSet",
    "parentIdentifier",
    "hierarchyLevel",
    "hierarchyLevelName",
    "contact",
    "dateStamp",
    "metadataStandardName",
    "metadataStandardVersion",
    "dataSetURI",
    "locale",
    "spatialRepresentationInfo",
    "referenceSystemInfo",
    "metadataExtensionInfo",
    "identificationInfo",
    "contentInfo",
    "distributionInfo",
    "dataQualityInfo",
    "portrayalCatalogueInfo",
    "metadataConstraints",
    "applicationSchemaInfo",
    "metadataMaintenance",
    "series",
    "describes",
    "propertyType",
    "featureType",
    "featureAttribute"
})
public class MDMetadataType
    extends AbstractObjectType
    implements ToString
{

    protected CharacterStringPropertyType fileIdentifier;
    protected CharacterStringPropertyType language;
    protected MDCharacterSetCodePropertyType characterSet;
    protected CharacterStringPropertyType parentIdentifier;
    protected List<MDScopeCodePropertyType> hierarchyLevel;
    protected List<CharacterStringPropertyType> hierarchyLevelName;
    @XmlElement(required = true)
    protected List<CIResponsiblePartyPropertyType> contact;
    @XmlElement(required = true)
    protected DatePropertyType dateStamp;
    protected CharacterStringPropertyType metadataStandardName;
    protected CharacterStringPropertyType metadataStandardVersion;
    protected CharacterStringPropertyType dataSetURI;
    protected List<PTLocalePropertyType> locale;
    protected List<MDSpatialRepresentationPropertyType> spatialRepresentationInfo;
    protected List<MDReferenceSystemPropertyType> referenceSystemInfo;
    protected List<MDMetadataExtensionInformationPropertyType> metadataExtensionInfo;
    @XmlElement(required = true)
    protected List<MDIdentificationPropertyType> identificationInfo;
    protected List<MDContentInformationPropertyType> contentInfo;
    protected MDDistributionPropertyType distributionInfo;
    protected List<DQDataQualityPropertyType> dataQualityInfo;
    protected List<MDPortrayalCatalogueReferencePropertyType> portrayalCatalogueInfo;
    protected List<MDConstraintsPropertyType> metadataConstraints;
    protected List<MDApplicationSchemaInformationPropertyType> applicationSchemaInfo;
    protected MDMaintenanceInformationPropertyType metadataMaintenance;
    protected List<DSAggregatePropertyType> series;
    protected List<DSDataSetPropertyType> describes;
    protected List<ObjectReferencePropertyType> propertyType;
    protected List<ObjectReferencePropertyType> featureType;
    protected List<ObjectReferencePropertyType> featureAttribute;

    /**
     * Gets the value of the fileIdentifier property.
     * 
     * @return
     *     possible object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public CharacterStringPropertyType getFileIdentifier() {
        return fileIdentifier;
    }

    /**
     * Sets the value of the fileIdentifier property.
     * 
     * @param value
     *     allowed object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public void setFileIdentifier(CharacterStringPropertyType value) {
        this.fileIdentifier = value;
    }

    public boolean isSetFileIdentifier() {
        return (this.fileIdentifier!= null);
    }

    /**
     * Gets the value of the language property.
     * 
     * @return
     *     possible object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public CharacterStringPropertyType getLanguage() {
        return language;
    }

    /**
     * Sets the value of the language property.
     * 
     * @param value
     *     allowed object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public void setLanguage(CharacterStringPropertyType value) {
        this.language = value;
    }

    public boolean isSetLanguage() {
        return (this.language!= null);
    }

    /**
     * Gets the value of the characterSet property.
     * 
     * @return
     *     possible object is
     *     {@link MDCharacterSetCodePropertyType }
     *     
     */
    public MDCharacterSetCodePropertyType getCharacterSet() {
        return characterSet;
    }

    /**
     * Sets the value of the characterSet property.
     * 
     * @param value
     *     allowed object is
     *     {@link MDCharacterSetCodePropertyType }
     *     
     */
    public void setCharacterSet(MDCharacterSetCodePropertyType value) {
        this.characterSet = value;
    }

    public boolean isSetCharacterSet() {
        return (this.characterSet!= null);
    }

    /**
     * Gets the value of the parentIdentifier property.
     * 
     * @return
     *     possible object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public CharacterStringPropertyType getParentIdentifier() {
        return parentIdentifier;
    }

    /**
     * Sets the value of the parentIdentifier property.
     * 
     * @param value
     *     allowed object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public void setParentIdentifier(CharacterStringPropertyType value) {
        this.parentIdentifier = value;
    }

    public boolean isSetParentIdentifier() {
        return (this.parentIdentifier!= null);
    }

    /**
     * Gets the value of the hierarchyLevel property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the hierarchyLevel property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getHierarchyLevel().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDScopeCodePropertyType }
     * 
     * 
     */
    public List<MDScopeCodePropertyType> getHierarchyLevel() {
        if (hierarchyLevel == null) {
            hierarchyLevel = new ArrayList<MDScopeCodePropertyType>();
        }
        return this.hierarchyLevel;
    }

    public boolean isSetHierarchyLevel() {
        return ((this.hierarchyLevel!= null)&&(!this.hierarchyLevel.isEmpty()));
    }

    public void unsetHierarchyLevel() {
        this.hierarchyLevel = null;
    }

    /**
     * Gets the value of the hierarchyLevelName property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the hierarchyLevelName property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getHierarchyLevelName().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link CharacterStringPropertyType }
     * 
     * 
     */
    public List<CharacterStringPropertyType> getHierarchyLevelName() {
        if (hierarchyLevelName == null) {
            hierarchyLevelName = new ArrayList<CharacterStringPropertyType>();
        }
        return this.hierarchyLevelName;
    }

    public boolean isSetHierarchyLevelName() {
        return ((this.hierarchyLevelName!= null)&&(!this.hierarchyLevelName.isEmpty()));
    }

    public void unsetHierarchyLevelName() {
        this.hierarchyLevelName = null;
    }

    /**
     * Gets the value of the contact property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the contact property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getContact().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link CIResponsiblePartyPropertyType }
     * 
     * 
     */
    public List<CIResponsiblePartyPropertyType> getContact() {
        if (contact == null) {
            contact = new ArrayList<CIResponsiblePartyPropertyType>();
        }
        return this.contact;
    }

    public boolean isSetContact() {
        return ((this.contact!= null)&&(!this.contact.isEmpty()));
    }

    public void unsetContact() {
        this.contact = null;
    }

    /**
     * Gets the value of the dateStamp property.
     * 
     * @return
     *     possible object is
     *     {@link DatePropertyType }
     *     
     */
    public DatePropertyType getDateStamp() {
        return dateStamp;
    }

    /**
     * Sets the value of the dateStamp property.
     * 
     * @param value
     *     allowed object is
     *     {@link DatePropertyType }
     *     
     */
    public void setDateStamp(DatePropertyType value) {
        this.dateStamp = value;
    }

    public boolean isSetDateStamp() {
        return (this.dateStamp!= null);
    }

    /**
     * Gets the value of the metadataStandardName property.
     * 
     * @return
     *     possible object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public CharacterStringPropertyType getMetadataStandardName() {
        return metadataStandardName;
    }

    /**
     * Sets the value of the metadataStandardName property.
     * 
     * @param value
     *     allowed object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public void setMetadataStandardName(CharacterStringPropertyType value) {
        this.metadataStandardName = value;
    }

    public boolean isSetMetadataStandardName() {
        return (this.metadataStandardName!= null);
    }

    /**
     * Gets the value of the metadataStandardVersion property.
     * 
     * @return
     *     possible object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public CharacterStringPropertyType getMetadataStandardVersion() {
        return metadataStandardVersion;
    }

    /**
     * Sets the value of the metadataStandardVersion property.
     * 
     * @param value
     *     allowed object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public void setMetadataStandardVersion(CharacterStringPropertyType value) {
        this.metadataStandardVersion = value;
    }

    public boolean isSetMetadataStandardVersion() {
        return (this.metadataStandardVersion!= null);
    }

    /**
     * Gets the value of the dataSetURI property.
     * 
     * @return
     *     possible object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public CharacterStringPropertyType getDataSetURI() {
        return dataSetURI;
    }

    /**
     * Sets the value of the dataSetURI property.
     * 
     * @param value
     *     allowed object is
     *     {@link CharacterStringPropertyType }
     *     
     */
    public void setDataSetURI(CharacterStringPropertyType value) {
        this.dataSetURI = value;
    }

    public boolean isSetDataSetURI() {
        return (this.dataSetURI!= null);
    }

    /**
     * Gets the value of the locale property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the locale property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getLocale().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link PTLocalePropertyType }
     * 
     * 
     */
    public List<PTLocalePropertyType> getLocale() {
        if (locale == null) {
            locale = new ArrayList<PTLocalePropertyType>();
        }
        return this.locale;
    }

    public boolean isSetLocale() {
        return ((this.locale!= null)&&(!this.locale.isEmpty()));
    }

    public void unsetLocale() {
        this.locale = null;
    }

    /**
     * Gets the value of the spatialRepresentationInfo property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the spatialRepresentationInfo property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getSpatialRepresentationInfo().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDSpatialRepresentationPropertyType }
     * 
     * 
     */
    public List<MDSpatialRepresentationPropertyType> getSpatialRepresentationInfo() {
        if (spatialRepresentationInfo == null) {
            spatialRepresentationInfo = new ArrayList<MDSpatialRepresentationPropertyType>();
        }
        return this.spatialRepresentationInfo;
    }

    public boolean isSetSpatialRepresentationInfo() {
        return ((this.spatialRepresentationInfo!= null)&&(!this.spatialRepresentationInfo.isEmpty()));
    }

    public void unsetSpatialRepresentationInfo() {
        this.spatialRepresentationInfo = null;
    }

    /**
     * Gets the value of the referenceSystemInfo property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the referenceSystemInfo property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getReferenceSystemInfo().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDReferenceSystemPropertyType }
     * 
     * 
     */
    public List<MDReferenceSystemPropertyType> getReferenceSystemInfo() {
        if (referenceSystemInfo == null) {
            referenceSystemInfo = new ArrayList<MDReferenceSystemPropertyType>();
        }
        return this.referenceSystemInfo;
    }

    public boolean isSetReferenceSystemInfo() {
        return ((this.referenceSystemInfo!= null)&&(!this.referenceSystemInfo.isEmpty()));
    }

    public void unsetReferenceSystemInfo() {
        this.referenceSystemInfo = null;
    }

    /**
     * Gets the value of the metadataExtensionInfo property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the metadataExtensionInfo property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getMetadataExtensionInfo().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDMetadataExtensionInformationPropertyType }
     * 
     * 
     */
    public List<MDMetadataExtensionInformationPropertyType> getMetadataExtensionInfo() {
        if (metadataExtensionInfo == null) {
            metadataExtensionInfo = new ArrayList<MDMetadataExtensionInformationPropertyType>();
        }
        return this.metadataExtensionInfo;
    }

    public boolean isSetMetadataExtensionInfo() {
        return ((this.metadataExtensionInfo!= null)&&(!this.metadataExtensionInfo.isEmpty()));
    }

    public void unsetMetadataExtensionInfo() {
        this.metadataExtensionInfo = null;
    }

    /**
     * Gets the value of the identificationInfo property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the identificationInfo property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getIdentificationInfo().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDIdentificationPropertyType }
     * 
     * 
     */
    public List<MDIdentificationPropertyType> getIdentificationInfo() {
        if (identificationInfo == null) {
            identificationInfo = new ArrayList<MDIdentificationPropertyType>();
        }
        return this.identificationInfo;
    }

    public boolean isSetIdentificationInfo() {
        return ((this.identificationInfo!= null)&&(!this.identificationInfo.isEmpty()));
    }

    public void unsetIdentificationInfo() {
        this.identificationInfo = null;
    }

    /**
     * Gets the value of the contentInfo property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the contentInfo property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getContentInfo().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDContentInformationPropertyType }
     * 
     * 
     */
    public List<MDContentInformationPropertyType> getContentInfo() {
        if (contentInfo == null) {
            contentInfo = new ArrayList<MDContentInformationPropertyType>();
        }
        return this.contentInfo;
    }

    public boolean isSetContentInfo() {
        return ((this.contentInfo!= null)&&(!this.contentInfo.isEmpty()));
    }

    public void unsetContentInfo() {
        this.contentInfo = null;
    }

    /**
     * Gets the value of the distributionInfo property.
     * 
     * @return
     *     possible object is
     *     {@link MDDistributionPropertyType }
     *     
     */
    public MDDistributionPropertyType getDistributionInfo() {
        return distributionInfo;
    }

    /**
     * Sets the value of the distributionInfo property.
     * 
     * @param value
     *     allowed object is
     *     {@link MDDistributionPropertyType }
     *     
     */
    public void setDistributionInfo(MDDistributionPropertyType value) {
        this.distributionInfo = value;
    }

    public boolean isSetDistributionInfo() {
        return (this.distributionInfo!= null);
    }

    /**
     * Gets the value of the dataQualityInfo property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the dataQualityInfo property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getDataQualityInfo().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link DQDataQualityPropertyType }
     * 
     * 
     */
    public List<DQDataQualityPropertyType> getDataQualityInfo() {
        if (dataQualityInfo == null) {
            dataQualityInfo = new ArrayList<DQDataQualityPropertyType>();
        }
        return this.dataQualityInfo;
    }

    public boolean isSetDataQualityInfo() {
        return ((this.dataQualityInfo!= null)&&(!this.dataQualityInfo.isEmpty()));
    }

    public void unsetDataQualityInfo() {
        this.dataQualityInfo = null;
    }

    /**
     * Gets the value of the portrayalCatalogueInfo property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the portrayalCatalogueInfo property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getPortrayalCatalogueInfo().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDPortrayalCatalogueReferencePropertyType }
     * 
     * 
     */
    public List<MDPortrayalCatalogueReferencePropertyType> getPortrayalCatalogueInfo() {
        if (portrayalCatalogueInfo == null) {
            portrayalCatalogueInfo = new ArrayList<MDPortrayalCatalogueReferencePropertyType>();
        }
        return this.portrayalCatalogueInfo;
    }

    public boolean isSetPortrayalCatalogueInfo() {
        return ((this.portrayalCatalogueInfo!= null)&&(!this.portrayalCatalogueInfo.isEmpty()));
    }

    public void unsetPortrayalCatalogueInfo() {
        this.portrayalCatalogueInfo = null;
    }

    /**
     * Gets the value of the metadataConstraints property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the metadataConstraints property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getMetadataConstraints().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDConstraintsPropertyType }
     * 
     * 
     */
    public List<MDConstraintsPropertyType> getMetadataConstraints() {
        if (metadataConstraints == null) {
            metadataConstraints = new ArrayList<MDConstraintsPropertyType>();
        }
        return this.metadataConstraints;
    }

    public boolean isSetMetadataConstraints() {
        return ((this.metadataConstraints!= null)&&(!this.metadataConstraints.isEmpty()));
    }

    public void unsetMetadataConstraints() {
        this.metadataConstraints = null;
    }

    /**
     * Gets the value of the applicationSchemaInfo property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the applicationSchemaInfo property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getApplicationSchemaInfo().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MDApplicationSchemaInformationPropertyType }
     * 
     * 
     */
    public List<MDApplicationSchemaInformationPropertyType> getApplicationSchemaInfo() {
        if (applicationSchemaInfo == null) {
            applicationSchemaInfo = new ArrayList<MDApplicationSchemaInformationPropertyType>();
        }
        return this.applicationSchemaInfo;
    }

    public boolean isSetApplicationSchemaInfo() {
        return ((this.applicationSchemaInfo!= null)&&(!this.applicationSchemaInfo.isEmpty()));
    }

    public void unsetApplicationSchemaInfo() {
        this.applicationSchemaInfo = null;
    }

    /**
     * Gets the value of the metadataMaintenance property.
     * 
     * @return
     *     possible object is
     *     {@link MDMaintenanceInformationPropertyType }
     *     
     */
    public MDMaintenanceInformationPropertyType getMetadataMaintenance() {
        return metadataMaintenance;
    }

    /**
     * Sets the value of the metadataMaintenance property.
     * 
     * @param value
     *     allowed object is
     *     {@link MDMaintenanceInformationPropertyType }
     *     
     */
    public void setMetadataMaintenance(MDMaintenanceInformationPropertyType value) {
        this.metadataMaintenance = value;
    }

    public boolean isSetMetadataMaintenance() {
        return (this.metadataMaintenance!= null);
    }

    /**
     * Gets the value of the series property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the series property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getSeries().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link DSAggregatePropertyType }
     * 
     * 
     */
    public List<DSAggregatePropertyType> getSeries() {
        if (series == null) {
            series = new ArrayList<DSAggregatePropertyType>();
        }
        return this.series;
    }

    public boolean isSetSeries() {
        return ((this.series!= null)&&(!this.series.isEmpty()));
    }

    public void unsetSeries() {
        this.series = null;
    }

    /**
     * Gets the value of the describes property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the describes property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getDescribes().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link DSDataSetPropertyType }
     * 
     * 
     */
    public List<DSDataSetPropertyType> getDescribes() {
        if (describes == null) {
            describes = new ArrayList<DSDataSetPropertyType>();
        }
        return this.describes;
    }

    public boolean isSetDescribes() {
        return ((this.describes!= null)&&(!this.describes.isEmpty()));
    }

    public void unsetDescribes() {
        this.describes = null;
    }

    /**
     * Gets the value of the propertyType property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the propertyType property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getPropertyType().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link ObjectReferencePropertyType }
     * 
     * 
     */
    public List<ObjectReferencePropertyType> getPropertyType() {
        if (propertyType == null) {
            propertyType = new ArrayList<ObjectReferencePropertyType>();
        }
        return this.propertyType;
    }

    public boolean isSetPropertyType() {
        return ((this.propertyType!= null)&&(!this.propertyType.isEmpty()));
    }

    public void unsetPropertyType() {
        this.propertyType = null;
    }

    /**
     * Gets the value of the featureType property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the featureType property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getFeatureType().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link ObjectReferencePropertyType }
     * 
     * 
     */
    public List<ObjectReferencePropertyType> getFeatureType() {
        if (featureType == null) {
            featureType = new ArrayList<ObjectReferencePropertyType>();
        }
        return this.featureType;
    }

    public boolean isSetFeatureType() {
        return ((this.featureType!= null)&&(!this.featureType.isEmpty()));
    }

    public void unsetFeatureType() {
        this.featureType = null;
    }

    /**
     * Gets the value of the featureAttribute property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the featureAttribute property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getFeatureAttribute().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link ObjectReferencePropertyType }
     * 
     * 
     */
    public List<ObjectReferencePropertyType> getFeatureAttribute() {
        if (featureAttribute == null) {
            featureAttribute = new ArrayList<ObjectReferencePropertyType>();
        }
        return this.featureAttribute;
    }

    public boolean isSetFeatureAttribute() {
        return ((this.featureAttribute!= null)&&(!this.featureAttribute.isEmpty()));
    }

    public void unsetFeatureAttribute() {
        this.featureAttribute = null;
    }

    public String toString() {
        final ToStringStrategy strategy = JAXBToStringStrategy.INSTANCE;
        final StringBuilder buffer = new StringBuilder();
        append(null, buffer, strategy);
        return buffer.toString();
    }

    public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy strategy) {
        strategy.appendStart(locator, this, buffer);
        appendFields(locator, buffer, strategy);
        strategy.appendEnd(locator, this, buffer);
        return buffer;
    }

    public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy strategy) {
        super.appendFields(locator, buffer, strategy);
        {
            CharacterStringPropertyType theFileIdentifier;
            theFileIdentifier = this.getFileIdentifier();
            strategy.appendField(locator, this, "fileIdentifier", buffer, theFileIdentifier);
        }
        {
            CharacterStringPropertyType theLanguage;
            theLanguage = this.getLanguage();
            strategy.appendField(locator, this, "language", buffer, theLanguage);
        }
        {
            MDCharacterSetCodePropertyType theCharacterSet;
            theCharacterSet = this.getCharacterSet();
            strategy.appendField(locator, this, "characterSet", buffer, theCharacterSet);
        }
        {
            CharacterStringPropertyType theParentIdentifier;
            theParentIdentifier = this.getParentIdentifier();
            strategy.appendField(locator, this, "parentIdentifier", buffer, theParentIdentifier);
        }
        {
            List<MDScopeCodePropertyType> theHierarchyLevel;
            theHierarchyLevel = (this.isSetHierarchyLevel()?this.getHierarchyLevel():null);
            strategy.appendField(locator, this, "hierarchyLevel", buffer, theHierarchyLevel);
        }
        {
            List<CharacterStringPropertyType> theHierarchyLevelName;
            theHierarchyLevelName = (this.isSetHierarchyLevelName()?this.getHierarchyLevelName():null);
            strategy.appendField(locator, this, "hierarchyLevelName", buffer, theHierarchyLevelName);
        }
        {
            List<CIResponsiblePartyPropertyType> theContact;
            theContact = (this.isSetContact()?this.getContact():null);
            strategy.appendField(locator, this, "contact", buffer, theContact);
        }
        {
            DatePropertyType theDateStamp;
            theDateStamp = this.getDateStamp();
            strategy.appendField(locator, this, "dateStamp", buffer, theDateStamp);
        }
        {
            CharacterStringPropertyType theMetadataStandardName;
            theMetadataStandardName = this.getMetadataStandardName();
            strategy.appendField(locator, this, "metadataStandardName", buffer, theMetadataStandardName);
        }
        {
            CharacterStringPropertyType theMetadataStandardVersion;
            theMetadataStandardVersion = this.getMetadataStandardVersion();
            strategy.appendField(locator, this, "metadataStandardVersion", buffer, theMetadataStandardVersion);
        }
        {
            CharacterStringPropertyType theDataSetURI;
            theDataSetURI = this.getDataSetURI();
            strategy.appendField(locator, this, "dataSetURI", buffer, theDataSetURI);
        }
        {
            List<PTLocalePropertyType> theLocale;
            theLocale = (this.isSetLocale()?this.getLocale():null);
            strategy.appendField(locator, this, "locale", buffer, theLocale);
        }
        {
            List<MDSpatialRepresentationPropertyType> theSpatialRepresentationInfo;
            theSpatialRepresentationInfo = (this.isSetSpatialRepresentationInfo()?this.getSpatialRepresentationInfo():null);
            strategy.appendField(locator, this, "spatialRepresentationInfo", buffer, theSpatialRepresentationInfo);
        }
        {
            List<MDReferenceSystemPropertyType> theReferenceSystemInfo;
            theReferenceSystemInfo = (this.isSetReferenceSystemInfo()?this.getReferenceSystemInfo():null);
            strategy.appendField(locator, this, "referenceSystemInfo", buffer, theReferenceSystemInfo);
        }
        {
            List<MDMetadataExtensionInformationPropertyType> theMetadataExtensionInfo;
            theMetadataExtensionInfo = (this.isSetMetadataExtensionInfo()?this.getMetadataExtensionInfo():null);
            strategy.appendField(locator, this, "metadataExtensionInfo", buffer, theMetadataExtensionInfo);
        }
        {
            List<MDIdentificationPropertyType> theIdentificationInfo;
            theIdentificationInfo = (this.isSetIdentificationInfo()?this.getIdentificationInfo():null);
            strategy.appendField(locator, this, "identificationInfo", buffer, theIdentificationInfo);
        }
        {
            List<MDContentInformationPropertyType> theContentInfo;
            theContentInfo = (this.isSetContentInfo()?this.getContentInfo():null);
            strategy.appendField(locator, this, "contentInfo", buffer, theContentInfo);
        }
        {
            MDDistributionPropertyType theDistributionInfo;
            theDistributionInfo = this.getDistributionInfo();
            strategy.appendField(locator, this, "distributionInfo", buffer, theDistributionInfo);
        }
        {
            List<DQDataQualityPropertyType> theDataQualityInfo;
            theDataQualityInfo = (this.isSetDataQualityInfo()?this.getDataQualityInfo():null);
            strategy.appendField(locator, this, "dataQualityInfo", buffer, theDataQualityInfo);
        }
        {
            List<MDPortrayalCatalogueReferencePropertyType> thePortrayalCatalogueInfo;
            thePortrayalCatalogueInfo = (this.isSetPortrayalCatalogueInfo()?this.getPortrayalCatalogueInfo():null);
            strategy.appendField(locator, this, "portrayalCatalogueInfo", buffer, thePortrayalCatalogueInfo);
        }
        {
            List<MDConstraintsPropertyType> theMetadataConstraints;
            theMetadataConstraints = (this.isSetMetadataConstraints()?this.getMetadataConstraints():null);
            strategy.appendField(locator, this, "metadataConstraints", buffer, theMetadataConstraints);
        }
        {
            List<MDApplicationSchemaInformationPropertyType> theApplicationSchemaInfo;
            theApplicationSchemaInfo = (this.isSetApplicationSchemaInfo()?this.getApplicationSchemaInfo():null);
            strategy.appendField(locator, this, "applicationSchemaInfo", buffer, theApplicationSchemaInfo);
        }
        {
            MDMaintenanceInformationPropertyType theMetadataMaintenance;
            theMetadataMaintenance = this.getMetadataMaintenance();
            strategy.appendField(locator, this, "metadataMaintenance", buffer, theMetadataMaintenance);
        }
        {
            List<DSAggregatePropertyType> theSeries;
            theSeries = (this.isSetSeries()?this.getSeries():null);
            strategy.appendField(locator, this, "series", buffer, theSeries);
        }
        {
            List<DSDataSetPropertyType> theDescribes;
            theDescribes = (this.isSetDescribes()?this.getDescribes():null);
            strategy.appendField(locator, this, "describes", buffer, theDescribes);
        }
        {
            List<ObjectReferencePropertyType> thePropertyType;
            thePropertyType = (this.isSetPropertyType()?this.getPropertyType():null);
            strategy.appendField(locator, this, "propertyType", buffer, thePropertyType);
        }
        {
            List<ObjectReferencePropertyType> theFeatureType;
            theFeatureType = (this.isSetFeatureType()?this.getFeatureType():null);
            strategy.appendField(locator, this, "featureType", buffer, theFeatureType);
        }
        {
            List<ObjectReferencePropertyType> theFeatureAttribute;
            theFeatureAttribute = (this.isSetFeatureAttribute()?this.getFeatureAttribute():null);
            strategy.appendField(locator, this, "featureAttribute", buffer, theFeatureAttribute);
        }
        return buffer;
    }

    public void setHierarchyLevel(List<MDScopeCodePropertyType> value) {
        this.hierarchyLevel = null;
        List<MDScopeCodePropertyType> draftl = this.getHierarchyLevel();
        draftl.addAll(value);
    }

    public void setHierarchyLevelName(List<CharacterStringPropertyType> value) {
        this.hierarchyLevelName = null;
        List<CharacterStringPropertyType> draftl = this.getHierarchyLevelName();
        draftl.addAll(value);
    }

    public void setContact(List<CIResponsiblePartyPropertyType> value) {
        this.contact = null;
        List<CIResponsiblePartyPropertyType> draftl = this.getContact();
        draftl.addAll(value);
    }

    public void setLocale(List<PTLocalePropertyType> value) {
        this.locale = null;
        List<PTLocalePropertyType> draftl = this.getLocale();
        draftl.addAll(value);
    }

    public void setSpatialRepresentationInfo(List<MDSpatialRepresentationPropertyType> value) {
        this.spatialRepresentationInfo = null;
        List<MDSpatialRepresentationPropertyType> draftl = this.getSpatialRepresentationInfo();
        draftl.addAll(value);
    }

    public void setReferenceSystemInfo(List<MDReferenceSystemPropertyType> value) {
        this.referenceSystemInfo = null;
        List<MDReferenceSystemPropertyType> draftl = this.getReferenceSystemInfo();
        draftl.addAll(value);
    }

    public void setMetadataExtensionInfo(List<MDMetadataExtensionInformationPropertyType> value) {
        this.metadataExtensionInfo = null;
        List<MDMetadataExtensionInformationPropertyType> draftl = this.getMetadataExtensionInfo();
        draftl.addAll(value);
    }

    public void setIdentificationInfo(List<MDIdentificationPropertyType> value) {
        this.identificationInfo = null;
        List<MDIdentificationPropertyType> draftl = this.getIdentificationInfo();
        draftl.addAll(value);
    }

    public void setContentInfo(List<MDContentInformationPropertyType> value) {
        this.contentInfo = null;
        List<MDContentInformationPropertyType> draftl = this.getContentInfo();
        draftl.addAll(value);
    }

    public void setDataQualityInfo(List<DQDataQualityPropertyType> value) {
        this.dataQualityInfo = null;
        List<DQDataQualityPropertyType> draftl = this.getDataQualityInfo();
        draftl.addAll(value);
    }

    public void setPortrayalCatalogueInfo(List<MDPortrayalCatalogueReferencePropertyType> value) {
        this.portrayalCatalogueInfo = null;
        List<MDPortrayalCatalogueReferencePropertyType> draftl = this.getPortrayalCatalogueInfo();
        draftl.addAll(value);
    }

    public void setMetadataConstraints(List<MDConstraintsPropertyType> value) {
        this.metadataConstraints = null;
        List<MDConstraintsPropertyType> draftl = this.getMetadataConstraints();
        draftl.addAll(value);
    }

    public void setApplicationSchemaInfo(List<MDApplicationSchemaInformationPropertyType> value) {
        this.applicationSchemaInfo = null;
        List<MDApplicationSchemaInformationPropertyType> draftl = this.getApplicationSchemaInfo();
        draftl.addAll(value);
    }

    public void setSeries(List<DSAggregatePropertyType> value) {
        this.series = null;
        List<DSAggregatePropertyType> draftl = this.getSeries();
        draftl.addAll(value);
    }

    public void setDescribes(List<DSDataSetPropertyType> value) {
        this.describes = null;
        List<DSDataSetPropertyType> draftl = this.getDescribes();
        draftl.addAll(value);
    }

    public void setPropertyType(List<ObjectReferencePropertyType> value) {
        this.propertyType = null;
        List<ObjectReferencePropertyType> draftl = this.getPropertyType();
        draftl.addAll(value);
    }

    public void setFeatureType(List<ObjectReferencePropertyType> value) {
        this.featureType = null;
        List<ObjectReferencePropertyType> draftl = this.getFeatureType();
        draftl.addAll(value);
    }

    public void setFeatureAttribute(List<ObjectReferencePropertyType> value) {
        this.featureAttribute = null;
        List<ObjectReferencePropertyType> draftl = this.getFeatureAttribute();
        draftl.addAll(value);
    }

}
